/****************************************************
	文件：Flee.cs
	作者：HuskyT
	邮箱：1005240602@qq.com
	日期：2020/5/17 22:1:24
	功能：逃离行为（远离某物体）
*****************************************************/

using UnityEngine;

namespace AIBehavior
{
    public class Flee : Decorator
    {
        private Vector3 mCurrentVelocity;
        /// <summary>
        /// 期望方向的速度
        /// </summary>
        private Vector3 mDesiredVelocity;
        /// <summary>
        /// 期望方向
        /// </summary>
        private Vector3 mDesiredDir;
        /// <summary>
        /// 引导向期望速度方向的引导力
        /// </summary>
        private Vector3 mSteerForce;
        /// <summary>
        /// 期望距离（距离目标点的距离）
        /// </summary>
        private float mDesiredDis;

        public Flee(AIData data) : base(data) { }

        public override void Init(AIData data) { }

        protected override void DoSelf()
        {
            if (mData.ObstacleList == null || mData.ObstacleList.Count <= 0) return;
            foreach (Obstacle obstacle in mData.ObstacleList)
            {
                float deltaDis = Vector3.Distance(mData.SelfTrans.position, obstacle.transform.position);
                if (deltaDis < obstacle.Radius && deltaDis > Consts.MIN_ERROR_DELTA)
                {
                    mDesiredDir = Vector3.Normalize(mData.SelfTrans.position - obstacle.transform.position);  //逃离的力的方向与移动到目标方向相反
                    mDesiredVelocity = mDesiredDir * mData.MaxForce_Flee / deltaDis;  //距离障碍物越近，逃离的力越大
                    mSteerForce = Vector3.ClampMagnitude(mDesiredVelocity - mCurrentVelocity, mData.MaxForce_Flee);  //引导力：由当前运动方向引导向期望方向
                    mSteerForce /= mData.Mass;  //引导力=>加速度
                    mCurrentVelocity = Vector3.ClampMagnitude(mCurrentVelocity + mSteerForce, mData.MaxVelocity);  //更新当前速度：受引导力影响后的速度
                    mData.SelfTrans.position += mCurrentVelocity * Time.fixedDeltaTime;  //更新位置
                }
            }
        }
    }
}